package com.dymall.config;

import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.rsa.crypto.KeyStoreKeyFactory;

import java.security.KeyPair;

@Configuration
@EnableConfigurationProperties(JwtProperties.class)
public class SecurityConfig {

    @Bean
    public PasswordEncoder passwordEncoder(){
        /*
          BCryptPasswordEncoder 是 Spring Security 提供的一个实现，使用 BCrypt 强哈希函数来加密密码。
          它提供了良好的安全性，因为每次生成的哈希值都是不同的，即使对于相同的输入也是如此
         */
        return new BCryptPasswordEncoder();
    }

    /**
     * 从指定的 keystore 文件中加载密钥对（公钥和私钥），
     * 通过使用私钥对 JWT 进行签名，接收方可以使用对应的公钥验证该 JWT 的真实性。
     *
     * @return 返回一个 KeyPair 对象，包含从 keystore 文件中读取的公钥和私钥
     */
    @Bean
    public KeyPair keyPair(JwtProperties properties){
        // 获取秘钥工厂
        KeyStoreKeyFactory keyStoreKeyFactory =
                new KeyStoreKeyFactory(
                        properties.getLocation(),//获取 keystore 文件的位置
                        properties.getPassword().toCharArray());//获取 keystore 文件的密码，并转换为字符数组形式
        //读取钥匙对
        return keyStoreKeyFactory.getKeyPair(
                properties.getAlias(),//获取密钥对的别名
                properties.getPassword().toCharArray());
    }
}